from enum import Enum
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, ConfigDict


class FilterOperator(str, Enum):
    """
    定义支持的数据库查询操作符。
    """
    EQUAL = "eq"
    NOT_EQUAL = "ne"
    LESS_THAN = "lt"
    LESS_THAN_OR_EQUAL = "lte"
    GREATER_THAN = "gt"
    GREATER_THAN_OR_EQUAL = "gte"
    IN = "in"
    NOT_IN = "notin"
    LIKE = "like"
    ILIKE = "ilike"
    IS = "is"
    IS_NOT = "isnot"


class BaseFilterParams(BaseModel):
    """
    可扩展的查询过滤参数基类。

    子类可以定义自己的字段，并通过 _operators 字典指定每个字段
    在数据库查询中应使用的操作符。
    """
    _operators: Dict[str, FilterOperator] = {}

    def to_filter_dict(self) -> Dict[str, Any]:
        """
        将模型实例转换为 Mapper 层能理解的过滤条件字典。
        
        - 过滤掉所有值为 None 的字段。
        - 根据 _operators 中定义的规则，为字段名添加操作符后缀。
        """
        filter_dict: Dict[str, Any] = {}
        # 获取所有非空字段
        data = self.model_dump(exclude_none=True)
        
        for field, value in data.items():
            operator = self._operators.get(field)
            if operator:
                # 如果定义了操作符，使用 "字段__操作符" 作为键
                filter_dict[f"{field}__{operator.value}"] = value
            else:
                # 默认使用等于操作
                filter_dict[f"{field}__eq"] = value
                
        return filter_dict

    model_config = ConfigDict(
        from_attributes=True,
        protected_namespaces=()  # 允许使用像 _operators 这样的以下划线开头的属性
    ) 